#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <thread>
#include <chrono>

int main(int argc, char** argv)
{
    MYSQL mysql;
    mysql_library_init(0, nullptr, nullptr);
    mysql_init(&mysql);

    std::string host = "127.0.0.1";
    //std::string host = "192.168.0.203";
    std::string user = "mysql_test";
    std::string pass = "123456";
    std::string db   = "mysql";

    // 设定超时3s
    // MYSQL_OPT_CONNECT_TIMEOUT:链接超时时间
    int to =  3;
    
    int ret = mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, &to);
    if (ret != 0)
    {
        std::cout << "mysql options  fialed!" << mysql_error(&mysql) << std::endl;
    }
    
    //  默认阻塞
    if (nullptr== mysql_real_connect(&mysql, host.c_str(), user.c_str(), pass.c_str(), db.c_str(), 3306, nullptr, 0))
    {
        std::cout << "mysql connect  fialed!" << mysql_error(&mysql) << std::endl;
    }

    // 1. 执行sql语句
    // mysql_real_query:  不需要分号结束，必须获取结果集并清理不然报错
    // mysql_query:       sql语句中有\0 就结束 不能有二进制数据 不需要分号结束

    // 读user 表 
    std::string sql = "SELECT * FROM user";
    ret = mysql_real_query(&mysql, sql.c_str(), sql.length());
    // mysql real query failed! Commands out of sync; you can't run this command now
    // 必须获取结果集并清理不然报错
    // ret = mysql_query(&mysql, sql.c_str());

    if (0 != ret)
    {
        std::cout << "mysql real query failed! " << mysql_error(&mysql) << std::endl;
    }
    else
    {
        std::cout << "mysql real query success! " << mysql_error(&mysql) << std::endl;
    }

    // 2 获取结果集
  
   MYSQL_RES* result = mysql_use_result(&mysql);

   // 保存结果集 到缓存
   // MYSQL_RES* result = mysql_store_result(&mysql);   
    if (nullptr == result)
    {
        std::cout << "mysql_use_result failed! " << mysql_error(&mysql) << std::endl;
    }


    // 3 遍历结果集

    // MYSQL_ROW mysql_fetch_row(MYSQL_RES* result): 读出来，都是用字符串格式, 返回一行数据, 通过下标访问, 最后一行返回null
    // unsigned long* mysql_fetch_lengths(MYSQL_RES* result): 返回每一列的数据长度(数组存储)
    // void mysql_free_result(MYSQL_RES* result):释放

    MYSQL_ROW row;
    while ((row = mysql_fetch_row(result)) != nullptr)
    {
        unsigned long* lens = mysql_fetch_lengths(result);  // lens[0] 每一行第一列的长度
        std::cout << lens[0] << "  " << "[" << row[0] << "] , [" << row[1] << " ]" << std::endl;
    }
    

    mysql_free_result(result);
    mysql_close(&mysql); 
    mysql_library_end();


    return 0;
} 